﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CDStore3Tiers
{
    public class XuLyHoaDon
    {
        static StoreCDDataContext dt ;

        /// <summary>
        /// Cập nhật thông tin hóa đơn
        /// </summary>
        /// <param name="ma">mã hóa đơn.</param>
        /// <param name="nd">Nội dung hóa đơn.</param>
        /// <param name="day">ngày lập hóa đơn.</param>

        
        public void GetConnect()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
        }
        /// <summary>
        /// Cập nhật thông tin hóa đơn
        /// </summary>
        /// <param name="ma">mã hóa đơn.</param>
        /// <param name="nd">Nội dung hóa đơn.</param>
        /// <param name="day">ngày lập hóa đơn.</param>
        public static void UpdateTTHoaDon(int ma, string nd, DateTime day)
        {
             dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            decimal tong = 0;
            List<vwChitietHD1> l = (from ct in dt.vwChitietHD1s
                                    where ct.MaHDBH == ma
                                    select ct).ToList<vwChitietHD1>();

            for (int i = 0; i < l.Count; i++)
            {
                tong += ConvertType.ToDecimal(l[i].ThanhTien);
            }

            // decimal tong = frm.fHoaDon.LayTongTien(ma);
            dt.HoaDonBan_Update(ma, nd, day, tong);
            dt.SubmitChanges();
        }
        /// <summary>
        /// Lấy một hóa đơn theo mã
        /// </summary>
        /// <param name="ma">mã của hóa đơn</param>
        /// <returns>Hóa đơn kết quả</returns>
        public static List<HoaDonBan> HoaDon_laytheoMa(int ma)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<HoaDonBan> kq = new List<HoaDonBan>();
            kq = (from hd in dt.HoaDonBans
                  where (hd.MaHDBH == ma)
                  select hd).ToList<HoaDonBan>();
            return kq;
        }
        /// <summary>
        /// Lấy danh sách hóa đơn hiện có của cửa hàng
        /// </summary>
        /// <returns>danh sách hóa đơn của cửa hàng</returns>
        public static List<HoaDonBan> HoaDon_LayTatCa()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<HoaDonBan> kq = new List<HoaDonBan>();
            kq = (from hd in dt.HoaDonBans
                  orderby hd.MaHDBH descending
                  select hd).ToList<HoaDonBan>();
            return kq;
        }
        /// <summary>
        /// Thêm mới một hóa đơn
        /// </summary>
        /// <param name="nd"> nội dung hóa đơn</param>
        /// <param name="day">ngày lập hóa đơn</param>
        /// <param name="id">người lập hóa đơn</param>
        public static void ThemMoiHoaDon(string nd, DateTime day, string id)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            HoaDonBan hd = new HoaDonBan();
            decimal tong = 0;
            dt.HoaDonBan_Insert(nd, day, tong, id);
            dt.SubmitChanges();

        }

        /// <summary>
        /// Lấy danh sách chi tiết hóa đơn thuộc về một hóa đơn
        /// </summary>
        /// <param name="ID">Mã hóa đơn</param>
        /// <returns>Danh sách chi tiết hóa đơn</returns>
        public static List<vwChiTietHoaDon> GetChiTietByID(int ID)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            return (from ct in dt.vwChiTietHoaDons
                    where (ct.MaHDBH == ID)
                    select ct).ToList<vwChiTietHoaDon>();
        }

        /// <summary>
        /// Lấy danh sách hóa đơn bán theo ngày
        /// </summary>
        /// <param name="day">ngày cần xem</param>
        /// <returns>danh sách hóa đơn bán trong ngày (day)</returns>
        public static List<HoaDonBan> layHoaDon_Ngay(DateTime day)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<HoaDonBan> kq = new List<HoaDonBan>();
            //   string newdate = DateTime.parse(day).tostring("dd/mm/yyyy");
            kq = (from hd in dt.HoaDonBans
                  where (hd.NgayLapHD.Month == day.Month && hd.NgayLapHD.Year == day.Year && hd.NgayLapHD.Day == day.Day)
                  select hd).ToList<HoaDonBan>();
            return kq;
        }
        /// <summary>
        /// Lấy danh sách hóa đơn bán theo tháng
        /// </summary>
        /// <param name="day">tháng cần xem</param>
        /// <returns>danh sách hóa đơn bán trong tháng </returns>
        public static List<HoaDonBan> LayHoaDon_Thang(DateTime day)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<HoaDonBan> kq = new List<HoaDonBan>();
            //   string newdate = DateTime.parse(day).tostring("dd/mm/yyyy");
            kq = (from hd in dt.HoaDonBans
                  where (hd.NgayLapHD.Month == day.Month && hd.NgayLapHD.Year == day.Year)
                  select hd).ToList<HoaDonBan>();
            return kq;
        }
        /// <summary>
        /// Lấy danh sách hóa đơn bán theo năm
        /// </summary>
        /// <param name="day">năm cần xem</param>
        /// <returns>danh sách hóa đơn bán trong năm</returns>
        public static List<HoaDonBan> LayHoaDon_Nam(DateTime day)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<HoaDonBan> kq = new List<HoaDonBan>();
            //   string newdate = DateTime.parse(day).tostring("dd/mm/yyyy");
            kq = (from hd in dt.HoaDonBans
                  where (hd.NgayLapHD.Year == day.Year)
                  select hd).ToList<HoaDonBan>();
            return kq;
        }
        /// <summary>
        /// Lọc danh sách hóa đơn trong một khoảng thời gian
        /// </summary>
        /// <param name="bd">thời gian bắt đầu</param>
        /// <param name="kt">thời gian kết thúc</param>
        /// <returns>Danh sách hóa đơn bán trong khoảng thời gian cần xem</returns>
        public List<HoaDonBan> LocDS(DateTime bd, DateTime kt)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            List<HoaDonBan> select = (from hd in dt.HoaDonBans
                                      where hd.NgayLapHD <= kt
                                            && hd.NgayLapHD >= bd
                                      select hd).ToList<HoaDonBan>();
            return select;
        }
        /// <summary>
        /// Lấy mã hóa đơn bán đàu tiên
        /// </summary>
        /// <returns>hóa đơn bán</returns>
        public int LayMaHoaDon()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            var b = (from t in dt.HoaDonBans
                     orderby t.MaHDBH descending
                     select t.MaHDBH).First();
            return b;
        }
        /// <summary>
        /// Lấy ra nội dung của một hóa đơn
        /// </summary>
        /// <returns>chuỗi nội dung của hóa đơn</returns>
        public string LayNoiDungHD()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            var b = (from t in dt.HoaDonBans
                     orderby t.MaHDBH descending
                     select t.NoiDungHD).First();
            return b;
        }
        /// <summary>
        /// Lấy ra ngày lập của 1 hóa đơn đầu tiên
        /// </summary>
        /// <returns>trả về ngày lập </returns>
        public DateTime LayNgayLapHD()
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            var b = (from t in dt.HoaDonBans
                     orderby t.MaHDBH descending
                     select t.NgayLapHD).First();
            return b;
        }
        /// <summary>
        /// Xóa một hóa đơn
        /// </summary>
        /// <param name="ma">mã của hóa đơn cần xóa</param>
        public static void XoaHoaDon(int ma)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            dt.HoaDonBan_Delete(ma);
            dt.SubmitChanges();
        }

        /// <summary>
        /// lấy tồng số trang hiển thị
        /// </summary>
        /// <param name="pagesize">số hóa đơn trong 1 trang</param>
        /// <returns>số trang</returns>
        public int TongSoTrang(int pagesize)
        {
            dt = new StoreCDDataContext();
            dt.Connection.ConnectionString = getConfig.getConnection();
            var a = (from t in dt.HoaDonBans
                     select t).Count();
            if (a % pagesize == 0)
            {
                a = (int)a / pagesize;
            }
            else
            {
                a = ((int)a / pagesize) + 1;
            }
            return a;
        }
        /// <summary>
        /// số trang dang hiển thị
        /// </summary>
        /// <param name="pagenumber">tổng số trang</param>
        /// <param name="pagesize">số hóa đơn trg trang</param>
        /// <returns>số trang</returns>
        public int SoTrangHienTai(int pagenumber, int pagesize)
        {
            int a = pagenumber;
            if (a % pagesize == 0)
            {
                a = (int)a / pagesize;
            }
            else
            {
                a = ((int)a / pagesize) + 1;
            }
            return a + 1;
        }
    }
}
